package com.huitone.smspfm.socket.protocol.sgip.message.msgbody;

import java.io.UnsupportedEncodingException;

import com.bin.common.utils.ArrayUtils;
import com.bin.common.utils.StringUtils;
import com.huitone.smspfm.socket.protocol.sgip.constant.Constant;
import com.huitone.smspfm.socket.protocol.sgip.conversion.TransferConverter;

/**   
* @Title Report.java 
* @Package com.huitone.smspfm.socket.protocol.sgip.msgbody 
* @Description Report命令用于向业务端发送一条先前的Submit命令的当前状态。 Report命令的接收方需要向发送方返回Report_Resp命令。
* @author ybliang   
* @date 2017年3月23日 上午11:06:29 
* @version V1.0   
*/
public class Report2 implements IBody {
	
	
	/**
	 * @字节长度 4
	 * @数据类型 Integer
	 * @DESC
	 *  serialNo的第1段
	 */
	private byte[] serialNoPart1 = new byte[4];
	
	/**
	 * @字节长度 4
	 * @数据类型 Integer
	 * @DESC
	 *  serialNo的第2段
	 */
	private byte[] serialNoPart2 = new byte[4];
	
	/**
	 * @字节长度 4
	 * @数据类型 Integer
	 * @DESC
	 *  serialNo的第3段
	 */
	private byte[] serialNoPart3 = new byte[4];
	
	/**
	 * @字节长度 1
	 * @数据类型 Integer
	 * @DESC
	    0：下发短信递交给运营商短信网关的状态报告
	    1：用户接收状态报告
	 */
	private byte[] reportType = new byte[1];
	
	/**
	 * @字节长度 21
	 * @数据类型 Text
	 * @DESC
	    接收短消息的手机号，手机号码前加“86”国别标志
	 */
	private byte[] userNumber = new byte[13];
	
	/**
	 * @字节长度 1
	 * @数据类型 Integer
	 * @DESC
	    当State=2时为错误码值，否则为0
	 */
	private byte[] errorCode = new byte[1];
	
	/**
	 * @字节长度 1
	 * @数据类型 Integer
	 * @DESC
	    错误说明的长度
	 */
	private byte[] errorMsgLength = new byte[1];
	
	/**
	 * @字节长度 errorMsgLen决定
	 * @数据类型 Text
	 * @DESC
	    (长度由ErrorMsgLen确定)发生错误时需要返回错误说明
	 */
	private byte[] errorMsg;
	
	/**
	 * @字节长度 21
	 * @数据类型 Text
	 * @DESC
	 * 	发送端口号
	 */
	private byte[] sendPort = new byte[21];
	
	private byte[] orgSrvNode = new byte[21];
	
	private byte[] orgSerialNoLength = new byte[4];
	
	private byte[] orgSerialNo;
	
	private byte[] report = null;
	
	public static Report2 build(byte[] bytes) {
		
		Report2 report = new Report2();
		
		int index = 0;
		
		report.serialNoPart1 = ArrayUtils.subarray(bytes, index, index += 4);
		report.serialNoPart2 = ArrayUtils.subarray(bytes, index, index += 4);
		report.serialNoPart3 = ArrayUtils.subarray(bytes, index, index += 4);
		report.reportType = ArrayUtils.subarray(bytes, index, index += 1);
		report.userNumber = ArrayUtils.subarray(bytes, index, index += 13);
		report.errorCode = ArrayUtils.subarray(bytes, index, index += 1);
		report.errorMsgLength = ArrayUtils.subarray(bytes, index, index += 1);
		report.errorMsg = ArrayUtils.subarray(bytes, index, index += report.getErrorMsgLength());
		report.sendPort = ArrayUtils.subarray(bytes, index, index += 21);
		report.orgSrvNode = ArrayUtils.subarray(bytes, index, index += 21);
		report.orgSerialNoLength = ArrayUtils.subarray(bytes, index, index += 4);
		report.orgSerialNo = ArrayUtils.subarray(bytes, index, index += report.getOrgSerialNoLength());
		
		return report;
	}
	
	/**
	 * 构建报告信息对象
	 * @param serialNoPart1 序列号的第一部分,源端编码
	 * @param serialNoPart2 序列号的第二部分,日期MMddHHmmss
	 * @param serialNoPart3 序列号的第三部分,序号
	 * @param reportType 报告类型
		   <br> 0：下发短信递交给运营商短信网关的状态报告
		   <br> 1：用户接收状态报告
	 * @param userNumber 用户号码
	 * @param errorCode 错误类型
	 * @param errorMsg 错误信息
	 * @return
	 */
	public static Report2 build(long serialNoPart1, long serialNoPart2, long serialNoPart3, 
			int reportType, String userNumber, int errorCode, String errorMsg, String sendPort, String orgSrvNode, String orgSerialNo) {
		
		Report2 report = new Report2();
		
		report.setSerialNoPart1(serialNoPart1);
		report.setSerialNoPart2(serialNoPart2);
		report.setSerialNoPart3(serialNoPart3);
		report.setReportType(reportType);
		report.setUserNumber(userNumber);
		report.setErrorCode(errorCode);
		report.setErrorMsg(errorMsg);
		report.setSendPort(sendPort);
		report.setOrgSrvNode(orgSrvNode);
		report.setOrgSerialNo(orgSerialNo);
		
		return report;
	}
	
	public long getSerialNoPart1() {
		return TransferConverter.bE2Long(serialNoPart1, 4);
	}

	private void setSerialNoPart1(long serialNoPart1) {
		this.serialNoPart1 = TransferConverter.toBE4(serialNoPart1);
	}

	public long getSerialNoPart2() {
		return TransferConverter.bE2Long(serialNoPart2, 4);
	}

	private void setSerialNoPart2(long serialNoPart2) {
		this.serialNoPart2 = TransferConverter.toBE4(serialNoPart2);
	}

	public long getSerialNoPart3() {
		return TransferConverter.bE2Long(serialNoPart3, 4);
	}

	private void setSerialNoPart3(long serialNoPart3) {
		this.serialNoPart3 = TransferConverter.toBE4(serialNoPart3);
	}

	public String getSerialNo() {
		
		StringBuffer buffer = new StringBuffer();
		
		buffer.append(getSerialNoPart1());
		buffer.append(getSerialNoPart2());
		buffer.append(getSerialNoPart3());
		
		return buffer.toString();
	}
	
	public int getReportType() {
		return TransferConverter.bE2Int1(this.reportType);
	}

	private void setReportType(int reportType) {
		this.reportType = TransferConverter.toBE1(reportType);
	}

	public String getUserNumber() {
		return TransferConverter.lj2Str(userNumber);
	}

	private void setUserNumber(String userNumber) {
		this.userNumber = TransferConverter.toLJ(this.userNumber, userNumber);
	}

	public int getErrorCode() {
		return TransferConverter.bE2Int1(errorCode);
	}

	private void setErrorCode(int errorCode) {
		this.errorCode = TransferConverter.toBE1(errorCode);
	}

	public int getErrorMsgLength() {
		return TransferConverter.bE2Int1(this.errorMsgLength);
	}

	private void setErrorMsgLength(int errorMsgLength) {
		this.errorMsgLength = TransferConverter.toBE1(errorMsgLength);
	}

	public String getErrorMsg() {
		
		String result = null;
		
		try {
			result = new String(this.errorMsg, Constant.defaultEncoding);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		return result;
	}
	
	private void setErrorMsg(String errorMsg) {
		
		if (errorMsg != null) {
			
			byte[] bytes;
			try {
				bytes = errorMsg.getBytes(Constant.defaultEncoding);
				setErrorMsgLength(bytes.length);
				this.errorMsg = bytes;
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
	}
	
	public String getOrgSrvNode() {
		return TransferConverter.lj2Str(orgSrvNode);
	}

	private void setOrgSrvNode(String orgSrvNode) {
		this.orgSrvNode = TransferConverter.toLJ(this.orgSrvNode, orgSrvNode);
	}

	public int getOrgSerialNoLength() {
		return TransferConverter.bE2Int4(orgSerialNoLength);
	}

	public void setOrgSerialNoLength(int orgSerialNoLength) {
		this.orgSerialNoLength = TransferConverter.toBE4(orgSerialNoLength);
	}

	public String getOrgSerialNo() {
		
		String result = null;
		
		try {
			result = new String(this.orgSerialNo, Constant.defaultEncoding);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		return result;
	}

	public void setOrgSerialNo(String orgSerialNo) {
		
		if (!StringUtils.isEmpty(orgSerialNo)) {
			
			try {
				byte[] bytes = orgSerialNo.getBytes(Constant.defaultEncoding);
				setOrgSerialNoLength(bytes.length);
				this.orgSerialNo = bytes;
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		} else {
			this.orgSerialNo = new byte[]{};
			setOrgSerialNoLength(0);
		}
	}
	
	public String getSendPort() {
		return TransferConverter.lj2Str(sendPort);
	}

	private void setSendPort(String sendPort) {
		this.sendPort = TransferConverter.toLJ(this.sendPort, sendPort);
	}

	@Override
	public byte[] toByteArray() {
		
		if (report == null) {
			report = ArrayUtils.addAll(serialNoPart1, serialNoPart2, serialNoPart3, reportType, userNumber, errorCode, errorMsgLength, errorMsg, sendPort, orgSrvNode, orgSerialNoLength, orgSerialNo);
		}
		
		return report;
	}

	@Override
	public int length() {
		return toByteArray().length;
	}

	@Override
	public String toString() {
		return "Report2 [序列号=" + getSerialNo() + ", 报告类型=" + getReportType() + ", 用户号码="
				+ getUserNumber() + ", 错误码=" + getErrorCode() + ", 错误信息=" + getErrorMsg()
				+ ", 旧客户端名=" + getOrgSrvNode() + ", 旧序列号=" + getOrgSerialNo() + ", 扩展码="
				+ getSendPort() + "]";
	}

	@Override
	public String toSimpleString() {
		return getUserNumber() + " " + getSerialNo() + " " + getReportType() + " " + getErrorCode() + " " + getOrgSrvNode() + " " + getSendPort() + " " + getOrgSerialNo();
	}
}
